package model;

import java.io.File;
import java.io.IOException;
import org.apache.log4j.Logger;

import result.Result;
import model.thread.ThreadUtil;
import business.BaseService;
import business.ViewLogger;
import business.iservices.FactoryBusinessSrv;
import utils.Configuration;

/**
 * Modelo para las distintas acciones del menu
 * @author 53385255R
 *
 */
public class MenuModel {
	
/**
 * Utilizadad para la ejecucion de hilos
 */
	private ThreadUtil threadUtil;
	private Logger _log;
	
	private String sqlitePath = "";
	private String sqlNewCorpsPath = "";
	private String maesorgPath = "";
	

	/**
	 * Constructor del modelo del menu
	 */
	public MenuModel() {
		threadUtil = new ThreadUtil();
		_log = Logger.getLogger("MenuModel");
	}
	

	
	
	
	
	/**
	 * Ejecuta el programa de trazas para abrir el fichero .log
	 * Tango el programa como el fichero los obtiene del fichero de properties
	 * @param path ruta del programa para abrir el fichero de log
	 */
	public void openLog(String path) {
		try {
			Runtime.getRuntime().exec(path + " " + Configuration.getInstance().getProperty("logFile"));
		} catch (IOException e) {
			_log.error(e);
			ViewLogger.getInstance().error("Error al abrir el log");
		}
		
	}

	

	/**
	 * Trocea y codifica los nuevos corps
	 */
	public void codeNewCorps(int autoThContext) {
		
		try {
			threadUtil.executeWithThread(threadUtil.METHOD_CODE_NEWCORPS, new String[] {autoThContext+""});
		} catch (Exception e) {
			_log.error(e);
			ViewLogger.getInstance().error("Error al codificar los nuevos corps. " + e.getMessage());
		}
		
	}
	

	public boolean setSqlitePath(String sqlitePath) {
		this.sqlitePath = sqlitePath;
		return model.databases.LoadDatabases.loadSqliteCorp(sqlitePath);
		
	}

	public String getSqlitePath() {
		return sqlitePath;
	}


	public boolean setSqNewCorpsPath(String sqlNewCorpsPath) {
		this.sqlNewCorpsPath = sqlNewCorpsPath;
		return model.databases.LoadDatabases.loadSqlNewCorps(sqlNewCorpsPath);
	}


	public String getSqlNewCorpsPath() {
		return sqlNewCorpsPath;
	}


	public boolean setMaesorgPath(String maesorgPath) {
		this.maesorgPath = maesorgPath;
		return model.databases.LoadDatabases.loadMaesorg(maesorgPath);
	}


	public String getMaesorgPath() {
		return maesorgPath;
	}






	/**
	 * Excluye las palabras indicadas en wordList y las palabras de una sola letra si asi se indica con oneLettter
	 * @param wordList listado de palabras separadas por ;
	 * @param oneLetter indica si tambien excluimos las palabras de una sola letra
	 */
	public void excludeWords(String wordList, boolean oneLetter) {
		Result<Object> res = FactoryBusinessSrv.getInstance().getBaseService().setExcludedWords(wordList, oneLetter);
		
		if (!res.is_ok())
			ViewLogger.getInstance().error("Error excluir las palabras. " + res.get_message());
		else ViewLogger.getInstance().info("Excluidas correctamente las palabras indicadas");
		
	}
	
	
	/**
	 * Resetea todas las palabras excluidas para que nadie sea excluido
	 */
	public void cleanExcludeWords() {
		Result<Object> res = FactoryBusinessSrv.getInstance().getBaseService().cleanExcludedWords();
		
		if (!res.is_ok())
			ViewLogger.getInstance().error("Error al resetear la columna 'excluded' de todas las palabras. " + res.get_message());
		else ViewLogger.getInstance().info("Reseteada correctamente la columna excluded de todas las palabras");
		
	}


	


	
	

	
	
	
	
}
